#if !defined(SHADEPAYLOAD_HPP)
#define SHADEPAYLOAD_HPP

#include <memory>

#include "Eigen"

#include "Material.hpp"
#include "Ray.hpp"

class Material;

// 视线发射后回传的信息
struct ShadePayload {
    // 该点法线
    Eigen::Vector3f normal;
    // 该点本色
    Eigen::Vector3f color;
    // 该点位置
    Eigen::Vector3f pos;
    // 该点纹理坐标
    float u, v;
    // 该点在光线上的位置
    float tNear;
    // 材料信息
    std::shared_ptr<Material> mat;
    // 法线是否是面向视线
    bool isFrontFace;   
    // 设置法向量，而且保证其是面向视线的
    void set_front_face_normal(const Ray& ray, const Eigen::Vector3f& outwardsNormal) {
        isFrontFace = ray.direction().dot(outwardsNormal) > 0;
        normal = isFrontFace ? outwardsNormal : -outwardsNormal;
    }
    
};

#endif // SHADEPAYLOAD_HPP